#ifndef __BASIC_CNFG_H__
#define __BASIC_CNFG_H__

#include <basic/misc.h>

__BEGIN_DECLS

#define RET_ERR_CNFG_SECTION_NOT_FOUND      -10     /* 段未找到 */
#define RET_ERR_CNFG_PROPERTY_NOT_FOUND     -11     /* 属性未找到 */
#define RET_ERR_CNFG_PROPERTY_NOT_COMPOSITE -12     /* 非复合属性 */

struct _cnfg;
typedef struct _cnfg *CNFG;

struct cnfg_property
{/*{{{*/
    enum cnfg_property_type
    {
        CNFG_PROPERTY_SIMPLE=1,
        CNFG_PROPERTY_NORMAL,
        CNFG_PROPERTY_COMPOSITE
    } type;
    char name[FILE_NM_SIZE+1];
    char value[LONG_FILE_NM_SIZE+1];
};/*}}}*/

/*
 * 读取配置文件
 */
extern int 	/* 0:成功 -1:打开配置文件出错 正整数:条目格式错误的行号 */
cnfg_load(
        char *cnfg_name,			/* [IN] 配置文件名称 */
        CNFG *pcnfg                 /* [OUT] 配置接口 */
        );

/*
 * 释放配置信息
 */
extern void
cnfg_free(
        CNFG cnfg		            /* [IN] 配置接口 */
        );

/*
 * 条目组
 */
extern int  /* 正整数:条目数量 */
cnfg_property_array(
        CNFG cnfg,                  /* [IN] 配置接口 */
        char *section_name,         /* [IN] 配置段名称 NULL:全局 */
        unsigned int flag,          /* [IN] 未设置 0
                                       大小写敏感 FLAG_CASE_SENSITIVE */
        struct cnfg_property **parray  /* [OUT] 属性组 需释放 */
        );

/*
 * 获取属性
 */
extern int  /* 0:成功 */
cnfg_get_property(
        CNFG cnfg,                  /* [IN] 配置接口 */
        char *section_name,         /* [IN] 配置段 NULL:全局 */
        char *property_name,        /* [IN] 条目名称 */
        unsigned int flag,          /* [IN] 未设置 0
                                       大小写敏感 FLAG_CASE_SENSITIVE */
        struct cnfg_property *property    /* [OUT] 属性 */
        );

/*
 * 获取子属性
 */
extern int  /* 0:成功 */
cnfg_get_subproperty(
        CNFG cnfg,                  /* [IN] 配置接口 */
        char *section_name,         /* [IN] 配置段 NULL:全局 */
        char *property_name,        /* [IN] 复合属性名称 */
        char *subproperty_name,     /* [IN] 子属性名称 */
        unsigned int flag,          /* [IN] 未设置 0
                                       大小写敏感 FLAG_CASE_SENSITIVE */
        struct cnfg_property *subproperty    /* [OUT] 子属性 */
        );

__END_DECLS

#endif
